package net.zjitc.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by Administrator on 2017/11/1.
 */
public class Test {
    public static void main(String[] args) throws Exception{
        Person p = new Person();
        /*反射
        * 类对象：
        * 一：通过实例获得
        * */
        Class clazz = p.getClass();
        System.out.println(clazz);
        System.out.println("--------构造器对象--------");
        //通过类对象拿构造器对象
        Constructor[] constructors = clazz.getConstructors();
        for(Constructor c : constructors){
            System.out.println(c);
        }

        System.out.println("--------成员变量对象--------");
        //成员变量
        Field[] fields = clazz.getDeclaredFields();//只有public age private
        /**
         * getDeclaredFields():能获得所有的成员变量，包括public private
         * getFields():只能获得public
         *  如果成员变量属性为private ,可通过setAccessible（）方法设置访问权限
         */
        for (Field f:fields){
            /*当对象的名字为age的时候才赋值21 */
            if (f.getName().equals("age")){

                f.setAccessible(true);
                f.set(p,21);
            }

            if ("name".equals(f.getName())){
                f.set(p,"lisi");
            }
            System.out.println(f);
        }


        Field name = clazz.getField("name");
        name.set(p,"zhangsan");

        //成员方法
        System.out.println("--------方法对象--------");
        Method[] methods = clazz.getMethods();
        for (Method m :methods){
            System.out.println(m);
        }
        /**类对象 找到方法对象  通过方法对象反射 调用某个实例的方法
        *  p.speak("zhangsan",21);
         *  1. p的类对象
         *  2.通过类对象获得其方法speak对象 m
         *  3.通过反射，再来调用p的speak方法
         *    m.invoke(p,"zs",21);
        * */
        /*某个方法*/
        System.out.println("--------speak方法对象--------");
        Method speak = clazz.getMethod("speak", String.class, int.class);
       //方法调用（哪个对象p，参数是name age）
        speak.invoke(p,"aaa",30);

        /*p.speak("zh",21);*/
        System.out.println("--------p的实例--------");
        System.out.println(p);
    }
}
